package gui.models;

import javax.swing.table.AbstractTableModel;

import logika.ListaProcesow;
import logika.Proces;
import utils.TyranizatorLogger;

public class TyranizatorTableModel extends AbstractTableModel {

	private ListaProcesow listaProcesow = new ListaProcesow();
	private TyranizatorLogger logger;

	Class[] columnTypes = new Class[] { Integer.class, Boolean.class,
			Boolean.class, String.class };

	String[] columnNames = new String[] { "Numer procesu", "Czy koordynator",
			"Czy aktywny", "Odebrane komunikaty" };

	@Override
	public Class getColumnClass(int columnIndex) {
		return columnTypes[columnIndex];
	}

	@Override
	public String getColumnName(int columnIndex) {
		return columnNames[columnIndex];
	}

	boolean[] columnEditables = new boolean[] { false, false, true, false };

	@Override
	public boolean isCellEditable(int row, int column) {
		return columnEditables[column];
	}

	@Override
	public Object getValueAt(int row, int column) {
		Proces p = listaProcesow.get(row);

		switch (column) {
		case 0:
			return p.getNumerProcesu();
		case 1:
			return p.getIsKoordynator();
		case 2:
			return p.getIsActiv();
		case 3:
			return p.getPrzetworzoneKomunikaty();
		}
		return null;

	}

	@Override
	public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
		super.setValueAt(aValue, rowIndex, columnIndex);
		if (columnIndex == 2) {
			Proces p = listaProcesow.get(rowIndex);
			p.setIsActiv((Boolean) aValue);
			logger.addLog("proces nr ["+ p.getNumerProcesu() +"] staje sie NIEAKTYWNY" );
			if((Boolean)aValue.equals(false)){
				p.setIsKoordynator(false);
			}
			
		}
	}

	@Override
	public int getRowCount() {
		return listaProcesow.getSize();
	}

	@Override
	public int getColumnCount() {
		return 4;
	}

	public TyranizatorLogger getLogger() {
		return logger;
	}

	public void setLogger(TyranizatorLogger logger) {
		this.logger = logger;
		listaProcesow.setLogger(logger);
	}

	public void create(int numerProcesu) {
		listaProcesow.create(numerProcesu);
		fireTableDataChanged();
	}
	
	public void delete(int numerProcesu) {
		listaProcesow.delete(numerProcesu);
		fireTableDataChanged();
	}

	public void elekcja(int num) {
		if (num == -1)
			return;
		
		
		
		Proces p = listaProcesow.get(num);
		if (p.getIsActiv()) {
			logger.addLog("Rozpoczynam proces ELEKCJI dla procesu nr ["+ p.getNumerProcesu()+"]");
			listaProcesow.wyczyscKomunikaty();
			p.elekcja();
			fireTableDataChanged();
		} else {
			logger.addLog("[Nie moge przeprowadzic elekcji dla procesu, ktory NIE jest aktywny]");
			System.out.println("Nie moge przeprowadzic elekcji dla procesu,ktory NIE jest aktywny");
		}
	}

}